package com.design_patterns.iterator.v3;

/**
 * @author: 李德才
 * @description:
 * @create: 2020-09-01 20:26
 **/

/**
 * 基于数组实现
 */
public class ArrayList_ implements Collection_ {
    private Object[] objects = new Object[10];
    private Integer index = 0;

    /**
     * 父级类无法对所有结构的子类进行遍历，只能子类自己实现
     *
     * @return
     */

    @Override
    public Iterator_ iterator() {
        return new ArrayListIterator_();
    }

    class ArrayListIterator_ implements Iterator_ {

        //        当前迭代器指针
        private int currentIndex = 0;

        @Override
        public boolean hasNext() {
//            当前指针大于等于集合的指针时，不再继续遍历
            if (currentIndex >= index) {
                return false;
            }
            return true;
        }

        @Override
        public Object next() {
//            返回指针指向的对象，并将指针下移，便于下次遍历
            Object object = objects[currentIndex];
            currentIndex++;
            return object;
        }
    }

    public String toString() {
        StringBuffer buffer = new StringBuffer();
        for (Object object : objects) {
            buffer.append(object.toString()).append(",");
        }
        return buffer.deleteCharAt(buffer.length() - 1).toString();
    }

    /**
     * 添加数据
     *
     * @param object
     * @return
     */
    public ArrayList_ add(Object object) {
//        长度已经饱和，需要扩容
        if (index == objects.length) {
//            创建一个长度为元数据的 1.5 倍的数组
            Object[] newObjects = new Object[objects.length + objects.length / 2];
//            将原数组拷贝到新的数组
            System.arraycopy(objects, 0, newObjects, 0, objects.length);
//            将Class中的数组对象指向新数组
            objects = newObjects;
        }
//        将新加的数据存入数组的尾部
        objects[index] = object;
//        索引值 +1 ，便于下次增加
        ++index;
//        返回当前类对象
        return this;
    }
    /**
     * @param      src      源数组.
     * @param      srcPos   源数组中的起始位置
     * @param      dest     目标数组。
     * @param      destPos  目标数组中的起始位置。
     * @param      length   要复制的数组元素的数目。
     */
    /**
     * 将 objects 中的数据从0号下标开始复制到 newObjects,
     * newObjects接收数据的下标也从0开始，
     * 复制的数据量为 objects 的长度
     */
    /**
     * System.arraycopy(objects, 0, newObjects, 0, objects.length);
     */

    /**
     * 获取数组长度
     *
     * @return
     */
    public Integer size() {
//        这也就是为什么长度比下标大1
//        return this.index - 1 ;
        return this.index;
    }


}
